﻿using Pe.Petecos.Comercial.Cross.Core.Constantes;
using Pe.Petecos.Comercial.Infraestructura.Core.Contract.Ventas;
using Pe.Petecos.Comercial.Infraestructura.Model.Ventas;
using Pe.Petecos.Comercial.Infraestructura.Repository.Base;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Pe.Petecos.Comercial.Infraestructura.Repository.Implements.Ventas
{
    public class EventoRepository : QueryRepository, IEventoRepository
    {
        public List<EventoLogic> Buscar(int codigoEvento = 0, int codigoCliente = 0, string codigoEstado = "", string nombreCliente = "", string nombreEvento = "", DateTime? fechaInicio = null, DateTime? fechaFin = null)
        {

            SqlParameter[] parametros = new SqlParameter[]
            {
                new SqlParameter("CODIGO_EVENTO", SqlDbType.Int) { Value = (object)codigoEvento ?? DBNull.Value },
                new SqlParameter("CODIGO_CLIENTE", SqlDbType.Int) { Value = (object)codigoCliente ?? DBNull.Value },
                new SqlParameter("CODIGO_ESTADO_EVENTO", SqlDbType.VarChar) { Value = (object)codigoEstado ?? DBNull.Value },
                new SqlParameter("NOMBRE_CLIENTE", SqlDbType.VarChar) { Value = (object)nombreCliente ?? DBNull.Value },
                new SqlParameter("NOMBRE_EVENTO", SqlDbType.VarChar) { Value = (object)nombreEvento ?? DBNull.Value },
                new SqlParameter("FECHA_INICIO", SqlDbType.DateTime) { Value = (object)fechaInicio ?? DBNull.Value },
                new SqlParameter("FECHA_FIN", SqlDbType.DateTime) { Value = (object)fechaFin ?? DBNull.Value },
                new SqlParameter("PARAMETRO_ESTADO_EVENTO", SqlDbType.Int) { Value = DatosConstantes.Parametro.EstadoEvento },
                new SqlParameter("PARAMETRO_TIPO_EVENTO", SqlDbType.Int) { Value = DatosConstantes.Parametro.TipoEvento }
            };

            return this.dataBaseProvider.ExecuteStoreProcedure<EventoLogic>("VTA.USP_EVENTO_SEL", parametros).ToList();
        }


        public int Insertar(EventoEntity evento)
        {
            var detalle = evento.ListaEventoDetalle.Select(x => new
            {
                CODIGO_ARTICULO_PROVEEDOR = x.CodigoArticuloProveedor,
                CODIGO_ARTICULO = 0,
                CODIGO_PROVEEDOR = 0,
                NOMBRE_GRUPO = x.NombreGrupo,
                PRECIO_ARTICULO = x.PrecioArticulo,
                CANTIDAD = x.Cantidad,                
                MONTO_TOTAL = x.MontoTotal
            }).ToList();

            SqlParameter[] parametros = new SqlParameter[]
            {
                new SqlParameter("CODIGO_CLIENTE", SqlDbType.Int) { Value = (object)evento.CodigoCliente ?? DBNull.Value },
                new SqlParameter("NOMBRE", SqlDbType.NVarChar) { Value = (object)evento.Nombre ?? DBNull.Value },
                new SqlParameter("CODIGO_TIPO_EVENTO", SqlDbType.NVarChar) { Value = (object)evento.CodigoTipoEvento ?? DBNull.Value },
                new SqlParameter("CODIGO_MONEDA", SqlDbType.NVarChar) { Value = (object)evento.CodigoMoneda ?? DBNull.Value },
                new SqlParameter("FECHA", SqlDbType.DateTime) { Value = (object)evento.Fecha ?? DBNull.Value },
                new SqlParameter("LUGAR", SqlDbType.NVarChar){ Value = (object)evento.Lugar ?? DBNull.Value },
                new SqlParameter("NOMBRE_ENCARGADO", SqlDbType.NVarChar){ Value = (object)evento.NombreEncargado ?? DBNull.Value },
                new SqlParameter("OBJETIVO", SqlDbType.NVarChar){ Value = (object)evento.Objetivo ?? DBNull.Value },
                new SqlParameter("OBSERVACIONES", SqlDbType.NVarChar){ Value = (object)evento.Observaciones ?? DBNull.Value },
                new SqlParameter("ES_PRESUPUESTO", SqlDbType.Bit){ Value = (object)evento.EsPresupuesto ?? DBNull.Value },

                new SqlParameter("MONTO_SUBTOTAL", SqlDbType.Decimal){ Value = (object)evento.MontoSubTotal ?? DBNull.Value },
                new SqlParameter("MONTO_IGV", SqlDbType.Decimal){ Value = (object)evento.MontoIgv ?? DBNull.Value },
                new SqlParameter("MONTO_TOTAL", SqlDbType.Decimal){ Value = (object)evento.MontoTotal ?? DBNull.Value },

                new SqlParameter("DOCUMENTO_CONTACTO", SqlDbType.NVarChar){ Value = (object)evento.DocumentoContacto ?? DBNull.Value },
                new SqlParameter("NOMBRE_CONTACTO", SqlDbType.NVarChar){ Value = (object)evento.NombreContacto ?? DBNull.Value },
                new SqlParameter("CORREO_ELECTRONICO_CONTACTO", SqlDbType.NVarChar){ Value = (object)evento.CorreoElectronicoContacto ?? DBNull.Value },
                new SqlParameter("TELEFONO_CONTACTO", SqlDbType.NVarChar){ Value = (object)evento.TelefonoContacto ?? DBNull.Value },

                new SqlParameter("CODIGO_ESTADO", SqlDbType.NVarChar){ Value = DatosConstantes.EstadoEvento.Registrado },
                new SqlParameter("USUARIO_CREACION", SqlDbType.NVarChar){ Value = (object)evento.UsuarioCreacion ?? DBNull.Value },
                new SqlParameter("LISTA_EVENTO_DETALLE", SqlDbType.Structured) { Value = detalle.ToDataTable(), TypeName = "VTA.TYPE_LISTA_EVENTO_DETALLE" }
            };
            return this.dataBaseProvider.ExecuteStoreProcedureScalar<int>("VTA.USP_EVENTO_INS", parametros);
        }

        public int Modificar(EventoEntity evento)
        {
            var detalle = evento.ListaEventoDetalle.Select(x => new
            {
                CODIGO_ARTICULO_PROVEEDOR = x.CodigoArticuloProveedor,
                CODIGO_ARTICULO = 0,
                CODIGO_PROVEEDOR = 0,
                NOMBRE_GRUPO = x.NombreGrupo,
                PRECIO_ARTICULO = x.PrecioArticulo,
                CANTIDAD = x.Cantidad,
                MONTO_TOTAL = x.MontoTotal
            }).ToList();

            SqlParameter[] parametros = new SqlParameter[]
            {
                new SqlParameter("CODIGO_EVENTO", SqlDbType.Int) { Value = (object)evento.CodigoEvento ?? DBNull.Value },
                new SqlParameter("CODIGO_CLIENTE", SqlDbType.Int) { Value = (object)evento.CodigoCliente ?? DBNull.Value },
                new SqlParameter("NOMBRE", SqlDbType.NVarChar) { Value = (object)evento.Nombre ?? DBNull.Value },
                new SqlParameter("CODIGO_TIPO_EVENTO", SqlDbType.NVarChar) { Value = (object)evento.CodigoTipoEvento ?? DBNull.Value },
                new SqlParameter("CODIGO_MONEDA", SqlDbType.NVarChar) { Value = (object)evento.CodigoMoneda ?? DBNull.Value },
                new SqlParameter("FECHA", SqlDbType.DateTime) { Value = (object)evento.Fecha ?? DBNull.Value },
                new SqlParameter("LUGAR", SqlDbType.NVarChar){ Value = (object)evento.Lugar ?? DBNull.Value },
                new SqlParameter("NOMBRE_ENCARGADO", SqlDbType.NVarChar){ Value = (object)evento.NombreEncargado ?? DBNull.Value },
                new SqlParameter("OBJETIVO", SqlDbType.NVarChar){ Value = (object)evento.Objetivo ?? DBNull.Value },
                new SqlParameter("OBSERVACIONES", SqlDbType.NVarChar){ Value = (object)evento.Observaciones ?? DBNull.Value },
                new SqlParameter("ES_PRESUPUESTO", SqlDbType.Bit){ Value = (object)evento.EsPresupuesto ?? DBNull.Value },

                new SqlParameter("MONTO_SUBTOTAL", SqlDbType.Decimal){ Value = (object)evento.MontoSubTotal ?? DBNull.Value },
                new SqlParameter("MONTO_IGV", SqlDbType.Decimal){ Value = (object)evento.MontoIgv ?? DBNull.Value },
                new SqlParameter("MONTO_TOTAL", SqlDbType.Decimal){ Value = (object)evento.MontoTotal ?? DBNull.Value },

                new SqlParameter("DOCUMENTO_CONTACTO", SqlDbType.NVarChar){ Value = (object)evento.DocumentoContacto ?? DBNull.Value },
                new SqlParameter("NOMBRE_CONTACTO", SqlDbType.NVarChar){ Value = (object)evento.NombreContacto ?? DBNull.Value },
                new SqlParameter("CORREO_ELECTRONICO_CONTACTO", SqlDbType.NVarChar){ Value = (object)evento.CorreoElectronicoContacto ?? DBNull.Value },
                new SqlParameter("TELEFONO_CONTACTO", SqlDbType.NVarChar){ Value = (object)evento.TelefonoContacto ?? DBNull.Value },

                new SqlParameter("CODIGO_ESTADO", SqlDbType.NVarChar){ Value = DatosConstantes.EstadoEvento.Registrado },
                new SqlParameter("USUARIO_CREACION", SqlDbType.NVarChar){ Value = (object)evento.UsuarioCreacion ?? DBNull.Value },
                new SqlParameter("LISTA_EVENTO_DETALLE", SqlDbType.Structured) { Value = detalle.ToDataTable(), TypeName = "VTA.TYPE_LISTA_EVENTO_DETALLE" }
            };
            return this.dataBaseProvider.ExecuteStoreProcedureNonQuery("VTA.USP_EVENTO_UDP", parametros);
        }

        public int ModificarEstado(List<int> codigos, string codigoEstado, string usuario)
        {
            var lista = codigos.Select(x => new
            {
                CODIGO = x
            }).ToList();

            SqlParameter[] parametros = new SqlParameter[]
            {
                
                new SqlParameter("LISTA_CODIGO", SqlDbType.Structured) { Value = lista.ToDataTable(), TypeName = "GRL.TYPE_LISTA_CODIGO" },
                new SqlParameter("CODIGO_ESTADO", SqlDbType.VarChar){ Value = (object)codigoEstado ?? DBNull.Value },
                new SqlParameter("USUARIO_MODIFICACION", SqlDbType.VarChar){ Value = (object)usuario ?? DBNull.Value }
            };
            return this.dataBaseProvider.ExecuteStoreProcedureNonQuery("VTA.USP_EVENTO_ESTADO_UDP", parametros);
        }


        public List<EventoDetalleLogic> BuscarDetalle(int codigoEvento, int codigoProveedor = 0)
        {
            SqlParameter[] parametros = new SqlParameter[]
            {
                new SqlParameter("CODIGO_EVENTO", SqlDbType.Int) { Value = (object)codigoEvento ?? DBNull.Value },
                new SqlParameter("CODIGO_PROVEEDOR", SqlDbType.Int) { Value = (object)codigoProveedor ?? DBNull.Value }
            };

            return this.dataBaseProvider.ExecuteStoreProcedure<EventoDetalleLogic>("VTA.USP_EVENTO_DETALLE_SEL", parametros).ToList();
        }
    }
}
